$nyquist plug-in
$version 5
$type generate nogroup
$name (_ "Pluck")
$debugbutton false
$preview linear
$author (_ "David R.Sky")
$release 4.0.0
$copyright (_ "GNU General Public License v2.0")


;;MIDI values for C notes: 36, 48, 60 [middle C], 72, 84, 96.

;; License: GPL v2+
;; http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
;;
;; For information about writing and modifying Nyquist plug-ins:
;; https://wiki.audacityteam.org/wiki/Nyquist_Plug-ins_Reference


$control PITCH (_ "Pluck MIDI pitch") int "" 60 1 120
$control FADE (_ "Fade-out type") choice ((_ "Abrupt") (_ "Gradual")) 0
$control DUR (_ "Duration (60s max)") time "" 1 0 60


; set final-amp for abrupt or gradual fade
(setf final-amp (if (= FADE 1) 0.001 0.000001))

(cond
  ((> DUR 0)
    ;; Get length of preview
    (setq pdur
      (if *previewp*
          (get '*project* 'preview-duration)
          DUR))

    (let* ((pluck-sound (snd-pluck *sound-srate* (step-to-hz PITCH) 0 DUR final-amp))
           (pluck-sound (extract-abs 0 pdur pluck-sound)) ; shorten if necessary for preview.
           (max-peak (peak pluck-sound ny:all)))
      ;; snd-pluck has a random element and will occasionally produce
      ;; zero amplitude at very high pitch settings. Avoid division by zero.
      (if (> max-peak 0)
          (scale (/ 0.8 max-peak) pluck-sound)
          pluck-sound)))
  ;; Length of sound is zero!
  ;; If previewing give Audacity a bit of silence, else return null string.
  (*previewp* (s-rest 0.1))
  (t ""))
